// Token管理工具类
const api = require('../api/index');

// 存储key常量
const ACCESS_TOKEN_KEY = 'XingTu_ACCESS_TOKEN';
const REFRESH_TOKEN_KEY = 'XingTu_REFRESH_TOKEN';
const TOKEN_EXPIRE_KEY = 'XingTu_TOKEN_EXPIRE';
const USER_INFO_KEY = 'XingTu_USER_INFO';

/**
 * Token管理工具类
 */
class TokenManager {
  /**
   * 保存登录凭证
   * @param {Object} loginData - 登录返回数据
   * @param {string} loginData.token - 访问令牌
   * @param {string} loginData.refreshToken - 刷新令牌
   * @param {number} loginData.expiresIn - 有效期(秒)
   * @param {number} loginData.userId - 用户ID
   * @param {string} loginData.username - 用户名
   * @param {boolean} loginData.isNewUser - 是否新用户
   */
  saveLoginData(loginData) {
    console.log('保存登录数据:', loginData);
    
    // 确保必要字段存在
    if (!loginData.token || !loginData.refreshToken || !loginData.expiresIn || !loginData.userId) {
      console.error('登录数据缺少必要字段:', loginData);
      throw new Error('登录数据不完整');
    }
    
    const { token, refreshToken, expiresIn, ...userInfo } = loginData;
    
    // 计算过期时间
    const expireTime = Date.now() + expiresIn * 1000;
    
    // 存储token相关信息
    wx.setStorageSync(ACCESS_TOKEN_KEY, token);
    wx.setStorageSync(REFRESH_TOKEN_KEY, refreshToken);
    wx.setStorageSync(TOKEN_EXPIRE_KEY, expireTime);
    
    // 保存用户信息，确保包含用户ID
    const userInfoToSave = {
      ...userInfo,
      id: userInfo.userId,
      // 处理新用户标记 - 修改为false避免重复处理
      isNewUser: false
    };
    
    wx.setStorageSync(USER_INFO_KEY, userInfoToSave);
    console.log('用户信息已保存:', userInfoToSave);
    
    // 如果是新用户，自动创建学生资料
    if (loginData.isNewUser) {
      console.log('检测到新用户，自动初始化账号...');
      
      try {
        // 设置默认头像和昵称等信息
        const defaultUserInfo = {
          avatarUrl: 'https://objectstorageapi.bja.sealos.run/a0qepsyj-001/text/profile/default-avatar.jpg',
          nickName: `用户${userInfoToSave.id}`,
          gender: 0,
          school: '绵阳师范学院',
          introduction: '这个人很懒，还没有填写简介',
          tags: ['新用户']
        };
        
        // 合并并保存到本地存储
        const combinedUserInfo = {...defaultUserInfo, ...userInfoToSave};
        wx.setStorageSync('userInfo', combinedUserInfo);
        
        console.log('新用户账号初始化完成');
      } catch (e) {
        console.error('新用户初始化失败:', e);
      }
      
      // 创建学生资料（异步，但不影响登录流程）
      try {
        const api = require('../api/index');
        api.user.getStudentProfile(token)
          .then(profile => {
            console.log('新用户学生资料创建成功:', profile);
          })
          .catch(error => {
            console.error('新用户学生资料创建失败:', error);
          });
      } catch (e) {
        console.error('调用创建学生资料API失败:', e);
      }
    }
  }
  
  /**
   * 获取访问令牌
   * @returns {string|null} - 访问令牌，不存在或已过期返回null
   */
  getAccessToken() {
    const token = wx.getStorageSync(ACCESS_TOKEN_KEY);
    const expireTime = wx.getStorageSync(TOKEN_EXPIRE_KEY);
    
    console.log('当前token:', token);
    console.log('过期时间:', expireTime);
    console.log('当前时间:', Date.now());
    
    // 检查token是否存在且未过期
    if (token && expireTime && Date.now() < expireTime) {
      return token;
    }
    
    console.log('Token不存在或已过期');
    return null;
  }
  
  /**
   * 获取刷新令牌
   * @returns {string|null} - 刷新令牌，不存在返回null
   */
  getRefreshToken() {
    return wx.getStorageSync(REFRESH_TOKEN_KEY) || null;
  }
  
  /**
   * 获取简单用户信息
   * @returns {Object|null} - 用户基本信息
   */
  getUserInfo() {
    return wx.getStorageSync(USER_INFO_KEY) || null;
  }
  
  /**
   * 刷新访问令牌
   * @returns {Promise} - 刷新结果，成功返回新的token信息
   */
  async refreshToken() {
    const refreshToken = this.getRefreshToken();
    
    if (!refreshToken) {
      return Promise.reject({
        code: 401,
        message: '没有可用的刷新令牌'
      });
    }
    
    try {
      const result = await api.auth.refreshToken(refreshToken);
      this.saveLoginData(result);
      return result;
    } catch (error) {
      // 刷新失败，清除所有凭证
      this.clearAll();
      return Promise.reject(error);
    }
  }
  
  /**
   * 清除所有认证信息
   */
  clearAll() {
    wx.removeStorageSync(ACCESS_TOKEN_KEY);
    wx.removeStorageSync(REFRESH_TOKEN_KEY);
    wx.removeStorageSync(TOKEN_EXPIRE_KEY);
    wx.removeStorageSync(USER_INFO_KEY);
  }
  
  /**
   * 退出登录
   * @returns {Promise} - 退出结果
   */
  async logout() {
    const token = this.getAccessToken();
    
    if (token) {
      try {
        await api.auth.logout(token);
      } catch (error) {
        console.error('Logout API error:', error);
      }
    }
    
    // 无论API是否成功，都清除本地存储
    this.clearAll();
    return Promise.resolve();
  }
  
  /**
   * 检查用户是否已登录
   * @returns {boolean} - 是否已登录
   */
  isLoggedIn() {
    const isLoggedIn = !!this.getAccessToken();
    console.log('检查登录状态:', isLoggedIn);
    return isLoggedIn;
  }
  
  /**
   * 获取请求需要的认证头
   * @returns {Object} - 包含认证信息的请求头对象
   */
  getAuthHeader() {
    const token = this.getAccessToken();
    return token ? { 'Authorization': `Bearer ${token}` } : {};
  }
}

// 导出单例
module.exports = new TokenManager(); 